#include <iostream>
using namespace std;

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
#include <fcntl.h>
#include <signal.h>

/* 自定义处理信号函数 */
void handleFunc(int sig)
{
    cout << "hello world" << endl;
}
void handleAlarmFunc(int sig)
{
    cout << "alarm comming..." << endl;
    alarm(3);       //实现每3s响一下
    
}

int main()
{
    /* 注册信号 */
    /* 
        信号的处理方式有三种：
        1.默认dfl
        2.忽略ign
        3.自定义
    */
    //signal(SIGINT, handleFunc);

    pid_t pid = fork();
    if(pid < 0)
    {
        perror("fork error:");
        _exit(-1);
    }
    else if(pid == 0)
    {   /* 子进程 */
        /* 注册信号处理函数 */
        signal(SIGUSR1, handleFunc);
        signal(SIGALRM, handleAlarmFunc);

        /* 设置一个5秒的定时器 */
        alarm(3);   //非阻塞，程序还会继续往下走

        while (true) 
        {
            pause(); // 等待信号
        }
    }
    else
    {   /* 父进程 */
        sleep(1);   //要等待子进程先运行，先注册信号，不然信号不会处理
        /* 发送信号 */
        while(1)
        {
            kill(pid, SIGUSR1); //自动发信号
            sleep(3);
        }
        
        wait(NULL);
    }

    


    return 0;
}